package cn.iocoder.yudao.module.project.service.internalcode;

import java.util.*;
import java.util.concurrent.CountDownLatch;
import javax.validation.*;
import cn.iocoder.yudao.module.project.controller.admin.internalcode.vo.*;
import cn.iocoder.yudao.module.project.controller.admin.workstation.vo.WorkstationRespVO;
import cn.iocoder.yudao.module.project.dal.dataobject.internalcode.InternalCodeDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;

/**
 * 内码信息 Service 接口
 *
 * @author 芋道源码
 */
public interface InternalCodeService {

    /**
     * 创建内码信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    String createInternalCode(@Valid InternalCodeSaveReqVO createReqVO);

    /**
     * 更新内码信息
     *
     * @param updateReqVO 更新信息
     */
    void updateInternalCode(@Valid InternalCodeSaveReqVO updateReqVO);

    /**
     * 删除内码信息
     *
     * @param id 编号
     */
    void deleteInternalCode(String id);

    /**
     * 获得内码信息
     *
     * @param id 编号
     * @return 内码信息
     */
    InternalCodeDO getInternalCode(String id);

    /**
     * 获得内码信息分页
     *
     * @param pageReqVO 分页查询
     * @return 内码信息分页
     */
    PageResult<InternalCodeDO> getInternalCodePage(InternalCodePageReqVO pageReqVO);




    /**
     * 查询已经存在的内码数据
     * @param params
     * @return
     */
    List<InternalCodeDO> selectSavedList(Map<String, Object> params);

    void insertRecord(List<InternalCodeDO> insertList);


    /**
     * 多线程批量插入数据
     * @param insertList
     * @param countDownLatch
     */
    void batchInsertRecord(List<InternalCodeDO> insertList, CountDownLatch countDownLatch);

    void updateRecord(List<InternalCodeDO> updateList);

    void saveRecord(List<InternalCodeDO> dataList);
    void saveRecordV2(List<InternalCodeDO> dataList);
    void batchSaveRecord(List<InternalCodeDO> dataList);

    /**
     * 设置规格型号,产品长度,订单类型
     *
     * @param datas
     * @return
     */
     List<InternalCodeRespVO> updateFlex(List<InternalCodeRespVO> datas);

    /**
     * 根据订单编号,产品规格,长度等设置订单详情id
     * @param dataList
     */
    void updateOrderDetailId(List<InternalCodeRespVO> dataList);

    List<InternalCodeRespVO> batchGetInternalCodeList(InternalCodePageReqVO pageReqVO);

    /**
     * 多线程批量设置规格型号,产品长度,订单类型,订单详情id
     * @param datas
     * @param countDownLatch
     * @return
     */
    List<InternalCodeRespVO> batchSetFlex(List<InternalCodeRespVO> datas, CountDownLatch countDownLatch);

    /**
     * 根据订单编号,产品规格,长度等设置订单详情id
     * @param datas
     * @return
     */
    List<InternalCodeRespVO> setOrderDetailId(List<InternalCodeRespVO> datas);

    /**
     * 上线称重
     * @param updateReqVO
     */
    String updateWeight(InternalCodeSaveReqVO updateReqVO);

    /**
     * 输入刚性测试结果
     * @param updateReqVO
     */
    void updateRigidity(InternalCodeSaveReqVO updateReqVO);

    /**
     * 输入平衡测试结果
     * @param updateReqVO
     */
    void updateBalance(InternalCodeSaveReqVO updateReqVO);

    /**
     * 清除该内码的所有称重数据、平衡和刚性数据
     * @param params
     */
    void clearWeightHistory(Map<String, Object> params);

    List<WorkstationRespVO> getWorkstationFromInternalCode(String code);

    PageResult<InternalCodeWorkstationRespVO> listWorkstationDetail(InternalCodePageReqVO pageReqVO);

    List<Map<String, Object>> listCurrentUserWorkstationOrderInfo(Integer deptId, String cacheOrderCode, Long userId);

    boolean isNextWorkstation(String internalCode, Integer workstationId);

    void rigidityAndBalance(InternalCodeSaveReqVO updateReqVO);

    boolean checkScanWorkstation(String internalCode, Integer workstationId);

    Set listCacheOrder();

    PageResult<InternalCodeWorkstationRespVO> listCurrentWorkstationDetail(InternalCodePageReqVO pageReqVO);
}
